/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Movilizacion;

import commonsbeans.*;
import commonsbridges.MaterialConstruccionProveedor;
import entities.*;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.*;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import persistence.*;
import persistence.exceptions.IllegalOrphanException;
import persistence.exceptions.NonexistentEntityException;
import persistence.exceptions.PreexistingEntityException;
import persistence.exceptions.RollbackFailureException;

/**
 *
 * @author Felipe Duarte
 */
@ManagedBean
@ViewScoped
public class GestionarProveedorMovilizacion implements Serializable {

    @ManagedProperty(value = "#{sessionBean}")
    private SessionBean sessionBean;
    @ManagedProperty(value = "#{applicationBean}")
    private ApplicationBean applicationBean;
    private TipoProveedorJpaController tipoProveedorJpaController = null;
    private ProveedorMaterialConstruccionJpaController proveedorMaterialConstruccionJpaController = null;
    private ProveedorJpaController proveedorJpaController = null;
    private CiudadJpaController ciudadJpaController = null;
    public List<Proveedor> listaProveedores = new ArrayList<Proveedor>();
    public List<TipoProveedor> listaTipoProveedor = new ArrayList<TipoProveedor>();
    public List<MedidaMaterial> listaMateriales = new ArrayList<MedidaMaterial>();
    public MaterialConstruccion materialConstruccion = new MaterialConstruccion();
    public ProveedorConstruccionJpaController proveedorConstruccionJpaController = new ProveedorConstruccionJpaController();
    public ProveedorMaterialConstruccion proveedorMaterialConstruccion = new ProveedorMaterialConstruccion();
    public List<Proveedor> listaAgregada = new ArrayList<Proveedor>();
    private List<SelectItem> listaProv;
    public Proveedor proveedor = new Proveedor();
    private DireccionJpaController direccionJpaController = null;
    private List<DatoComplementario> datoComplementarioList = null;
    private DatoComplementarioJpaController datoComplementarioJpaController = null;
    private PrefijoJpaController prefijoJpaController = null;
    private List<Prefijo> prefijoList;
    private Proveedor proveedorselected = new Proveedor();
    private List<TipoVia> tipoViaList;
    String globeIcon = "";
    boolean habilitarmapa = false;
    String globeIconDisable = "";
    String direccionMostrada = "";
    public TipoVia tipoVia = new TipoVia();
    private Prefijo prefijoVacio = new Prefijo();
    private DatoComplementario complementarioVacio = new DatoComplementario();
    private boolean editar = false;

    public GestionarProveedorMovilizacion() {
    }

    //Constructor
    @PostConstruct
    public void init() {
        if (sessionBean.getUsuarioActual() != null) {
            initControllers();
            cargarProveedores();
            cargarListasDireccion();
            cargarResumenProveedor();
            cargarTipoPoveedor();
            proveedor.setDireccionIdDireccion(new Direccion());
            habilitarmapa = true;
            globeIcon = "/resources/Globe2Disabled.png";
            complementarioVacio = datoComplementarioJpaController.findDatoComplementario(19);
            prefijoVacio = prefijoJpaController.findPrefijo(25);


        }

    }

    //<editor-fold defaultstate="collapsed" desc="Funcionalidades">
    /**
     * Metodo para cargar las listas asociadas a las direcciones
     *
     * @see ApplicationBean
     * @see Prefijo
     * @see DatoComplementario
     * @see TipoVia
     *
     */
    private void cargarListasDireccion() {
        prefijoList = applicationBean.getPrefijoList();
        tipoViaList = applicationBean.getTipoViaList();
        datoComplementarioList = applicationBean.getDatoComplementarioList();
    }

    public void actualizarInformacion() {
        cargarProveedores();
        cargarResumenProveedor();
    }

    /**
     * Metodo para cargar los tipos de proveedores
     *
     */
    private void cargarTipoPoveedor() {
        TipoProveedor transporte = new TipoProveedor();
        transporte = tipoProveedorJpaController.findTipoProveedor(4);
        listaTipoProveedor.add(transporte);

    }

    /**
     * Metodo para cargar el resumen de los proveedores por ciudad, la ciudad
     * esta asociada a el usuario logueado
     *
     */
    private void cargarResumenProveedor() {
        listaAgregada = proveedorJpaController.getProveedorPorCiudadMovilizacion(sessionBean.getUsuarioActual().getCiudadIdCiudad());
    }

    /**
     * Metodo para cargar los proveedores
     *
     */
    private void cargarProveedores() {
        listaProveedores.clear();
        listaProveedores = ciudadJpaController.findCiudad(sessionBean.getUsuarioActual().getCiudadIdCiudad().getIdCiudad()).getProveedorList();
    }

    /**
     * Metodo para crear los proveedores, se crea si la variable de editar es
     * false, es decir no hay seleccionado ningun proveedor
     *
     * @see ProveedorJpaController
     * @see Proveedor
     *
     */
    public void guardarProveedor() {

        if (proveedor.getLatitudProveedor() == null) {
            showErrorMessage("Debe ubicar al proveedor en el mapa");
        } else {
            if (!editar) {
                try {
                    proveedor.setCiudadIdCiudad(sessionBean.getUsuarioActual().getCiudadIdCiudad());
                    proveedor.setIdProveedor(proveedorJpaController.getIdMax() + 1);
                    proveedor.setEstadoProveedor(true);
                    proveedor.getDireccionIdDireccion().setIdDireccion(direccionJpaController.getIdMax() + 1);
                    direccionJpaController.create(proveedor.getDireccionIdDireccion());
                    proveedorJpaController.create(proveedor);
                    showSuccessMessage("Se ha guardado el proveedor de manera éxitosa");
                    listaAgregada.add(proveedor);
                } catch (PreexistingEntityException ex) {
                    Logger.getLogger(GestionarProveedorMovilizacion.class.getName()).log(Level.SEVERE, null, ex);
                } catch (RollbackFailureException ex) {
                    Logger.getLogger(GestionarProveedorMovilizacion.class.getName()).log(Level.SEVERE, null, ex);
                } catch (Exception ex) {
                    Logger.getLogger(GestionarProveedorMovilizacion.class.getName()).log(Level.SEVERE, null, ex);
                }
            } else {
                editarProveedor();
                cargarResumenProveedor();
            }
            limpiarCampos();
        }

    }

    /**
     * Metodo para editar el proveedor de abastecimiento
     *
     * @see Proveedor
     * @see Direccion
     *
     */
    private void editarProveedor() {
        try {
            direccionJpaController.edit(proveedor.getDireccionIdDireccion());
            proveedorJpaController.edit(proveedor);
            showSuccessMessage("Se ha actualizado el proveedor de manera éxitosa");
        } catch (IllegalOrphanException ex) {
            Logger.getLogger(GestionarProveedorMovilizacion.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(GestionarProveedorMovilizacion.class.getName()).log(Level.SEVERE, null, ex);
        } catch (RollbackFailureException ex) {
            Logger.getLogger(GestionarProveedorMovilizacion.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(GestionarProveedorMovilizacion.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Muestra mensajes para notificar error en la transacción
     *
     * @param detail Detalle del error
     */
    public void showErrorMessage(String detail) {
        Logger.getLogger("Error en  bean").log(Level.SEVERE, detail, detail);
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", detail);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    /**
     * Metodo para revisar la direccion y asignar la direccion construida para
     * el geo referenciador
     *
     */
    public void revisarDireccion() {
        String ciudad = sessionBean.getUsuarioActual().getCiudadIdCiudad().getNombreCiudad() + " " + sessionBean.getUsuarioActual().getCiudadIdCiudad().getIdDepartamentoCiudad().getNombreDepartamento();
        Direccion d = new Direccion();
        int i = 0;
        d = proveedor.getDireccionIdDireccion();
        if (d.getIdPrefijo1() == null) {

            d.setIdPrefijo1(prefijoVacio);
        }
        if (d.getDatoComplementario() == null) {

            d.setDatoComplementario(complementarioVacio);
        }
        if (d.getIdPrefijo2() == null) {
            d.setIdPrefijo2(prefijoVacio);
        }
        if (d.getIdPrefijo3() == null) {
            d.setIdPrefijo3(prefijoVacio);
        }
        if (d.getIdPrefijo4() == null) {
            d.setIdPrefijo4(prefijoVacio);
        }
        if (d.getTipoViaIdTipoVia() == null) {
            d.setTipoViaIdTipoVia(new TipoVia());
            i = 1;
        }
        if (d.getNombreViaDireccion() == null || d.getNumeroViaDireccion() == null || d.getNumeroPlacaDireccion() == null) {
            i = 1;
        }
        if (i == 0) {
            direccionMostrada = d.getTipoViaIdTipoVia().getNombreTipoVia() + " " + d.getNombreViaDireccion() + " " + d.getIdPrefijo1().getNombrePrefijo() + " "
                    + d.getIdPrefijo2().getNombrePrefijo() + " " + d.getNumeroViaDireccion() + " " + d.getIdPrefijo3().getNombrePrefijo() + " "
                    + d.getIdPrefijo4().getNombrePrefijo() + " " + d.getNumeroPlacaDireccion() + " " + ciudad;


            globeIcon = "/resources/Globe2.png";
            habilitarmapa = false;
        } else {
            globeIcon = "/resources/Globe2Disabled.png";
            habilitarmapa = true;
        }

    }

    /**
     * Metodo para recoger el valor del proveedor seleccionado
     *
     */
    public void rowSelected() {
        proveedor = proveedorselected;
        revisarDireccion();
        editar = true;
    }

    /**
     * Metodo para deseleccionar el valor del proveedor seleccionado
     *
     */
    public void onRow() {
        proveedorselected = new Proveedor();
        proveedor = new Proveedor();
        editar = false;
    }

    public void showSuccessMessage(String detail) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Operación exitosa", detail);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    /**
     * Metodo para limpiar el formulario
     *
     */
    private void limpiarCampos() {
        proveedor = new Proveedor();
        proveedorselected = new Proveedor();
        direccionMostrada = "";
    }
//</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Getter's y setter's">
    public List<Proveedor> getListaProveedores() {
        return listaProveedores;
    }

    public void setListaProveedores(List<Proveedor> listaProveedores) {
        this.listaProveedores = listaProveedores;
    }

    public ProveedorMaterialConstruccion getProveedorMaterialConstruccion() {
        return proveedorMaterialConstruccion;
    }

    public Proveedor getProveedorselected() {
        return proveedorselected;
    }

    public void setProveedorselected(Proveedor proveedorselected) {
        this.proveedorselected = proveedorselected;
    }

    public TipoVia getTipoVia() {
        return tipoVia;
    }

    public void setTipoVia(TipoVia tipoVia) {
        this.tipoVia = tipoVia;
    }

    public void setProveedorMaterialConstruccion(ProveedorMaterialConstruccion proveedorMaterialConstruccion) {
        this.proveedorMaterialConstruccion = proveedorMaterialConstruccion;
    }

    public boolean isHabilitarmapa() {
        return habilitarmapa;
    }

    public void setHabilitarmapa(boolean habilitarmapa) {
        this.habilitarmapa = habilitarmapa;
    }

    public SessionBean getSessionBean() {
        return sessionBean;
    }

    public String getDireccionMostrada() {
        return direccionMostrada;
    }

    public void setDireccionMostrada(String direccionMostrada) {
        this.direccionMostrada = direccionMostrada;
    }

    public void setSessionBean(SessionBean sessionBean) {
        this.sessionBean = sessionBean;
    }

    public List<TipoProveedor> getListaTipoProvedor() {
        return listaTipoProveedor;
    }

    public void setListaTipoProvedor(List<TipoProveedor> listaTipoProvedor) {
        this.listaTipoProveedor = listaTipoProvedor;
    }

    public List<MedidaMaterial> getListaMateriales() {
        return listaMateriales;
    }

    public void setListaMateriales(List<MedidaMaterial> listaMateriales) {
        this.listaMateriales = listaMateriales;
    }

    public MaterialConstruccion getMaterialConstruccion() {
        return materialConstruccion;
    }

    public void setMaterialConstruccion(MaterialConstruccion materialConstruccion) {
        this.materialConstruccion = materialConstruccion;
    }

    public List<Proveedor> getListaAgregada() {
        return listaAgregada;
    }

    public void setListaAgregada(List<Proveedor> listaAgregada) {
        this.listaAgregada = listaAgregada;
    }

    public ApplicationBean getApplicationBean() {
        return applicationBean;
    }

    public void setApplicationBean(ApplicationBean applicationBean) {
        this.applicationBean = applicationBean;
    }

    public Proveedor getProveedor() {
        return proveedor;
    }

    public void setProveedor(Proveedor proveedor) {
        this.proveedor = proveedor;
    }

    public List<SelectItem> getListaProv() {
        return listaProv;
    }

    public String getGlobeIcon() {
        return globeIcon;
    }

    public void setGlobeIcon(String globeIcon) {
        this.globeIcon = globeIcon;
    }

    public void setListaProv(List<SelectItem> listaProv) {
        this.listaProv = listaProv;
    }

    public List<TipoVia> getTipoViaList() {
        return tipoViaList;
    }

    public void setTipoViaList(List<TipoVia> tipoViaList) {
        this.tipoViaList = tipoViaList;
    }

    public List<DatoComplementario> getDatoComplementarioList() {
        return datoComplementarioList;
    }

    public void setDatoComplementarioList(List<DatoComplementario> datoComplementarioList) {
        this.datoComplementarioList = datoComplementarioList;
    }

    public List<Prefijo> getPrefijoList() {
        return prefijoList;

    }

    public void setPrefijoList(List<Prefijo> prefijoList) {
        this.prefijoList = prefijoList;
    }

    public String getGlobeIconDisable() {
        return globeIconDisable;
    }

    public void setGlobeIconDisable(String globeIconDisable) {
        this.globeIconDisable = globeIconDisable;
    }
//</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Inicializar los controladores">
    public void initControllers() {
        FacesContext context = FacesContext.getCurrentInstance();
        tipoProveedorJpaController = (TipoProveedorJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "tipoProveedorJpaController");
        proveedorJpaController = (ProveedorJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "proveedorJpaController");
        direccionJpaController = (DireccionJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "direccionJpaController");
        prefijoJpaController = (PrefijoJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "prefijoJpaController");
        datoComplementarioJpaController = (DatoComplementarioJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "datoComplementarioJpaController");
        ciudadJpaController = (CiudadJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "ciudadJpaController");
    }
//</editor-fold>
}
